]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st/theme: Unref CRStylesheet after removing old theme nodes
authorJonas Dreßler <verdre@v0yd.nl>
Thu, 30 Apr 2020 20:23:52 +0000 (22:23 +0200)
committerFlorian Müllner <florian.muellner@gmail.com>
Fri, 1 May 2020 14:24:16 +0000 (14:24 +0000)
Since we now remove all theme nodes on a stylesheet change (ie.
StTheme's "custom-stylesheets-changed" signal) instead of only
invalidating them, those nodes may not be accessed anymore as soon as
"custom-stylesheets-changed" is emitted.

It turned out though that when comparing them to the newly generated
nodes in `st_widget_recompute_style()` using the
`st_theme_node_paint/geometry_equal()` functions, the properties of the
old nodes will still be accessed, causing a crash since the
CRDeclarations are already freed.

To fix that, keep the reference to the CRStylesheet, which owns the
CRDeclarations used by the theme nodes, around a bit longer, so it's
still possible to access the CRDeclarations inside the
"custom-stylesheets-changed" signal handler. This allows us to compare
the old theme nodes to the new ones since the CSS properties of both are
still valid.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2709

src/st/st-theme.c

index 0d2d2eeacec712d43d00677ff2b8ef6127113d35..7ccf7b5bad1d3b695b0fe48c0228bf3da329f74a 100644 (file)
@@ -287,8 +287,10 @@ st_theme_unload_stylesheet (StTheme    *theme,
   theme->custom_stylesheets = g_slist_remove (theme->custom_stylesheets, stylesheet);
   g_hash_table_remove (theme->stylesheets_by_file, file);
   g_hash_table_remove (theme->files_by_stylesheet, stylesheet);
-  cr_stylesheet_unref (stylesheet);
+
   g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
+
+  cr_stylesheet_unref (stylesheet);
 }
 
 /**